package cn.springcloud.api.apiUtils;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;


import java.util.List;

import static cn.hutool.core.util.ReflectUtil.*;




@Slf4j
public class EnumUtil {

    public static String values = "values";

    public static String getName = "getName";

    public static String getValue = "getValue";

    public static String get = "get";

    /**
     * 根据name获取枚举实例
     */
    public static <T> T nameOf(Class<T> enumClass, String name) {
        if (enumClass.isEnum()) {
            for (T e : listEnumsByGen(enumClass)) {
                if(invoke(e, getMethod(enumClass, getName)).equals(name)) {
                    return e;
                }
            }
        }

        return null;
    }
    /**
     * 根据value获取枚举实例
     */
    public static <T> T valueOf(Class<T> enumClass, Object value) {
        if (enumClass.isEnum()) {
            for (T e : listEnumsByGen(enumClass)) {
                if(invoke(e, getMethod(enumClass, getValue)).equals(value)) {
                    return e;
                }
            }
        }

        return null;
    }

    /**
     * 根据value获取name
     */
    public static String getName(Class<?> enumClass, Object value) {
        if (enumClass.isEnum()) {
            for (Enum e : listEnumsByClass(enumClass)) {
                if(invoke(e, getMethod(enumClass, getValue)).equals(value)) {
                    return invoke(e, getMethod(enumClass, getName));
                }
            }
        }

        return null;
    }


    
    /**
     * list enums by enumName
     */
    public static List<Enum> listEnums(String enumName) {
        List<Enum> enums = Lists.newArrayList();
        Class<?> enumClass = forName(enumName);
        if (enumClass.isEnum()) {
            enums = Lists.newArrayList(listEnumsByClass(enumClass));
        }

        return enums;
    }

    /**
     * 根据EnumName获取枚举类型
     */
    private static Class<?> forName(String enumName) {
        Class<?> enumClass = null;
        try {
            enumClass = Class.forName(enumName);
        } catch (Exception e) {
          //  log.error("枚举类【{}】解析失败", enumName, e);
        }

        return enumClass;
    }

    /**
     * 根据generic获取所有枚举实例
     */
    private static <T> T[] listEnumsByGen(Class<T> enumClass) {
        return invokeStatic(getMethod(enumClass, values));
    }

    /**
     * 根据EnumClass获取所有枚举实例
     */
    private static Enum[] listEnumsByClass(Class<?> enumClass) {
        return invokeStatic(getMethod(enumClass, values));
    }

}